﻿/*
 *  ============================================================================
 *  Name:           Gestão de parques de estacionamento
 *  Author:         João Faria
 *  Email:          a8836@alunos.ipca.pt
 *                  jfaria.gmr@gmail.com
 *  Version:        0
 *  Date:           2013-04-10
 *  Copyright:       
 *  Description:    IPCA - Programação II
 *                  Projecto final
 *  ============================================================================
 */
using System;
using System.Collections.Generic;
using GesParking.BusinessObjects;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace GesParking.DataLayer
{
    /// <summary>
    /// Classe que guarda os parques
    /// </summary>
    [Serializable]
    public class ParksDL
    {
        #region Estado

        static bool alterado;
        static List<ParkBo> listParks;

        #endregion

        #region Construtor

        /// <summary>
        /// Construtor por omissão
        /// </summary>
        public ParksDL()
        {
            alterado = true;
            listParks = new List<ParkBo>();
        }

        #endregion

        #region Propriedades

        /// <summary>
        /// Propriedade alterado
        /// </summary>
        public static bool Alterado
        {
            get { return alterado; }
            set { alterado = value; }
        }

        #endregion

        #region Metodos
        
        /// <summary>
        /// Adciona novo parque
        /// </summary>
        /// <param name="p">Parque</param>
        public static void AddDL(ParkBo p)
        {
            listParks.Add(p);
        }

        /// <summary>
        /// Desactiva um parque
        /// </summary>
        /// <param name="p">Parque</param>
        public static void DisableDL(ParkBo p)
        {
            listParks.Find(delegate(ParkBo pk) { return pk.Id == p.Id; }).Activo = false;
        }

        /// <summary>
        /// Actualiza o nome do parque
        /// </summary>
        /// <param name="id">Id do parque</param>
        /// <param name="n">Nome do parque</param>
        public static void UpdateParkNameDL(Guid id, string n)
        {
            listParks.Find(delegate(ParkBo pk) { return pk.Id == id; }).Name = n;
        }

        /// <summary>
        /// Actualiza a capacidade máxima do parque
        /// </summary>
        /// <param name="id">Id do parque</param>
        /// <param name="n">Capacidade do parque</param>
        public static void UpdateParkMaxLoadDL(Guid id, int n)
        {
            listParks.Find(delegate(ParkBo pk) { return pk.Id == id; }).MaxLoad = n;
        }

        /// <summary>
        /// Lista todos os parques
        /// </summary>
        /// <returns></returns>
        public static List<ParkBo> ListDL()
        {
            return listParks;
        }

        /// <summary>
        /// Grava os dados dos parkes
        /// </summary>
        public static void Save()
        {
            /* 
             * Falta tratar erros com acessos e permissões de ficheiros
             */
            FileStream fsParksDL = new FileStream(@"Data\Parks.dat", FileMode.Create);
            BinaryFormatter bfwParksDL = new BinaryFormatter();
            bfwParksDL.Serialize(fsParksDL, listParks);
            fsParksDL.Close();
        }

        /// <summary>
        /// Classe que lê os dados dos parques
        public static void Read()
        {
            /* 
             * Falta tratar erros com acessos e permissões de ficheiros
             */
            FileStream fsParksDL = new FileStream(@"Data\Parks.dat", FileMode.Open);
            BinaryFormatter bfwParksDL = new BinaryFormatter();
            listParks = (List<ParkBo>)bfwParksDL.Deserialize(fsParksDL);
        }

        #endregion

    }
}
